//
// Created by hkkzzxz on 2025/1/9.
//

#ifndef TEST_UNDERLYINGCLIENT_H
#define TEST_UNDERLYINGCLIENT_H

#include <boost/asio.hpp>
#include <iostream>
#include <thread>

namespace lrpc {
    using boost::asio::ip::tcp;

    class UnderlyingClient {
    public:
        UnderlyingClient(boost::asio::io_context &ioContext,
                         const std::string &host, int port);

        ~UnderlyingClient();

        // 发送消息
        void sendMessage(const std::vector<char> &message);

        // 接收消息
        std::vector<char> recvMessage();

        // 启动用户输入循环
        void startUserInputLoop();

    private:
        tcp::socket socket_;
        // 心跳包计时器
        boost::asio::steady_timer heartbeat_timer_;
        const std::chrono::seconds heartbeat_interval_ = std::chrono::seconds(55);

        // 协程发送消息
        boost::asio::awaitable<void> send(const std::vector<char> &message);

        // 接收消息
        boost::asio::awaitable<std::vector<char>> recv();

        // 重置心跳包计时器
        void resetHeartbeatTimer();
    };
}

#endif //TEST_UNDERLYINGCLIENT_H
